package com.example.pdftomarkdown.service;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * PDF解析服务类
 * 负责从PDF文件中提取文本内容
 */
@Service
public class PdfParserService {
    
    private static final Pattern TITLE_PATTERN = Pattern.compile("^[A-Z][^.!?]*$");
    private static final Pattern CHAPTER_PATTERN = Pattern.compile("^(第[一二三四五六七八九十\\d]+章|Chapter\\s+\\d+|\\d+\\.).*");
    
    /**
     * 从MultipartFile中提取PDF文本内容
     * 
     * @param file 上传的PDF文件
     * @return 提取的文本内容
     * @throws IOException 文件处理异常
     */
    public String extractTextFromPdf(MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            throw new IllegalArgumentException("上传的文件不能为空");
        }
        
        if (!isPdfFile(file)) {
            throw new IllegalArgumentException("只支持PDF格式文件");
        }
        
        try (InputStream inputStream = file.getInputStream();
             PDDocument document = PDDocument.load(inputStream)) {
            
            return extractTextFromDocument(document);
        }
    }
    
    /**
     * 从PDF文档中提取结构化文本内容
     * 
     * @param document PDF文档对象
     * @return 结构化的文本内容
     * @throws IOException 文档处理异常
     */
    private String extractTextFromDocument(PDDocument document) throws IOException {
        PDFTextStripper pdfStripper = new PDFTextStripper();
        pdfStripper.setSortByPosition(true);
        
        StringBuilder structuredText = new StringBuilder();
        int totalPages = document.getNumberOfPages();
        
        // 按页提取内容，保持文档结构
        for (int page = 1; page <= totalPages; page++) {
            pdfStripper.setStartPage(page);
            pdfStripper.setEndPage(page);
            
            String pageText = pdfStripper.getText(document);
            String processedText = processPageText(pageText, page);
            
            if (!processedText.trim().isEmpty()) {
                structuredText.append(processedText);
                if (page < totalPages) {
                    structuredText.append("\n\n---\n\n"); // 页面分隔符
                }
            }
        }
        
        return structuredText.toString();
    }
    
    /**
     * 处理单页文本，识别标题和段落结构
     * 
     * @param pageText 原始页面文本
     * @param pageNumber 页码
     * @return 处理后的文本
     */
    private String processPageText(String pageText, int pageNumber) {
        if (pageText == null || pageText.trim().isEmpty()) {
            return "";
        }
        
        String[] lines = pageText.split("\n");
        List<String> processedLines = new ArrayList<>();
        
        for (String line : lines) {
            String trimmedLine = line.trim();
            
            // 跳过空行和页码
            if (trimmedLine.isEmpty() || isPageNumber(trimmedLine)) {
                continue;
            }
            
            // 处理可能的标题
            if (isPotentialTitle(trimmedLine)) {
                processedLines.add("### " + trimmedLine);
            } 
            // 处理章节标题
            else if (isChapterTitle(trimmedLine)) {
                processedLines.add("## " + trimmedLine);
            }
            // 普通段落
            else {
                processedLines.add(trimmedLine);
            }
        }
        
        return String.join("\n", processedLines);
    }
    
    /**
     * 判断是否为PDF文件
     * 
     * @param file 上传的文件
     * @return 是否为PDF文件
     */
    private boolean isPdfFile(MultipartFile file) {
        String contentType = file.getContentType();
        String filename = file.getOriginalFilename();
        
        return ("application/pdf".equals(contentType)) || 
               (filename != null && filename.toLowerCase().endsWith(".pdf"));
    }
    
    /**
     * 判断是否为页码行
     */
    private boolean isPageNumber(String line) {
        return line.matches("^\\s*\\d+\\s*$") || 
               line.matches("^\\s*-\\s*\\d+\\s*-\\s*$") ||
               line.matches("^\\s*Page\\s+\\d+\\s*$");
    }
    
    /**
     * 判断是否为潜在标题
     */
    private boolean isPotentialTitle(String line) {
        // 短行且首字母大写，可能是标题
        return line.length() < 100 && 
               line.length() > 5 &&
               Character.isUpperCase(line.charAt(0)) &&
               !line.endsWith(".") &&
               !line.contains("  "); // 避免正文中的短句
    }
    
    /**
     * 判断是否为章节标题
     */
    private boolean isChapterTitle(String line) {
        return CHAPTER_PATTERN.matcher(line).matches();
    }
}